#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

//int add_count(int count)
//{
//  int sum = 0;
//
//  for(int i = 0; i <= count; i++)
//  {
//    sum += i;
//  }
//
//  return sum;
//}

int main()
{
  //子进程创建成功返回子进程的pid
  int id_pid = fork();
  
  if(id_pid == 0)
  {
    printf("i am child process\n"); 

    sleep(5);
    exit(66);
  }

  int status = 0;
  pid_t id = wait(&status);

  if(id != -1)
    printf("退出码：%d 退出信号：%d\n", WIFSTOPPED(status), WSTOPSIG(status));

 // if(id_pid == 0)
 // {
    //child
    

  //  int count = 50;
  //  while(count)
  //  {
  //    printf("我是子进程，我还没有结束！ pid:%d, ppid:%d, %d\n", getpid(), getppid(), count--);
  //    sleep(1);

  //  }
  //  exit(66);
  //}

 // while(1)
 // {

 //   //父进程
 //   int status = 0;
 //   //int ret_id = waitpid(id_pid, &status, 0);//参数0，waitpid用法和wait一样
 //   
 //   //waitpid第三个参数设置成WNOHANG，可以让父进程在等待子进程的过程时，去处理父进程分内的事情
 //   int ret_id = waitpid(id_pid, &status, WNOHANG);//W：wait；NO：不；HANG表示夯住了
 //   
 //   //waitpid返回值：0表示子进程还在运行; >0表示子进程正常结束；<0发生错误
 //   if(ret_id == 0)
 //   {
 //     printf("父进程的任务正在运行...\n");
 //     sleep(1);
 //     continue;
 //   }
 //   else if(ret_id > 0)
 //   {
 //     //status总共4个字节，前两个字节不用，第三个字节表示退出码，第四个字节后7比特位表示终止信号0 0000000
 //    // printf("我是父进程，等待子进程成功！pid:%d, ppid:%d, 子进程:%d, 退出码:%d, 终止信号：\
 //    //     %x\n", getpid(), getppid(), ret_id, (status>>8)&0xFF, status&0x7F);

 //     break;
 //   }
 //   else
 //   {
 //     printf("waitpid error\n");
 //     exit(1);
 //   }
 // }

  //sleep(10);
  //wait：父进程处于阻塞等待状态（等待子进程退出，这个过程中父进程不会有所作为）
  //pid_t pid_child = wait(NULL);

  //printf("我是父进程，等待子进程成功！pid:%d, ppid:%d, child_pid:%d\n", getpid(), getppid(), pid_child);
  
  //sleep(5);
  //int count = 100;
  //int sum = add_count(count);

  //for(int i = 0; i < 256; i++)
  //{
  // //C语言库进程退出码表示的含义
  //  printf("%d:%s\n", i, strerror(i));
  //}
  
  //if(sum == 5050) return 0;
  //else return 200;
  

  //exit和_exit区别
  //exit头文件：stdlib.h;_exit头文件：unistd.h
  
  //printf("hello world");
  ////exit(0);//exit库函数，进程退出时会刷新缓冲区
  //sleep(1);
  //_exit(66);//_exit系统调用接口，进程退出时不会刷新缓存区

  return 0;
}
